
#include "Engine/common.h"
#include "Engine/uimgr.h"
#include "Engine/ControlDef.h"
#include "strid.h"
#include "DNF定义.h"
#include "设置模块.h"
#include "AppUI.h"

//列：30，70，280，320
//行起始16，每行加39(28图标10强化1空隙)：16，55，94，133
int 部位展示X[拓展装备部位总数]={
	//上衣2 下装1 护肩1 腰带2 鞋子1 手镯3 项链4 戒指4 左槽3 右槽4 耳环3 武器3 称号4 宠物2
	70,30,30,70,30,280,320,320,280,320,280,280,320,70};

int 部位展示Y[拓展装备部位总数]={
	//上衣1 下装2 护肩1 腰带2 鞋子3 手镯2 项链2 戒指3 左槽3 右槽4 耳环4 武器1 称号1 宠物3
	16,55,16,55,94,55,55,94,94,133,133,16,16,94};

int 徽章颜色ResId[右槽+1]={RID_绿色徽章槽位,RID_绿色徽章槽位,RID_黄色徽章槽位,RID_红色徽章槽位,RID_蓝色徽章槽位,
	RID_蓝色徽章槽位,RID_黄色徽章槽位,RID_红色徽章槽位,RID_白金徽章槽位,RID_白金徽章槽位};

//横向有效空间为8位字符，技能伤害和攻击强化整数有5位，百分号和小数点占2位，小数部分只能显示1位
//如果位数更多，就要考虑调整技能伤害和攻击强化这两行的标签位置了（已经留出空间）
//其余属性位置比较宽裕，加上符号位仍有空余
//小于0的属性会改用红色显示，修改的时候不要忘记

//宽度暂定200，最长的应该也够了
//高度14，以App字体为准（App字体比DNF字体高2像素）

//横向位置
//对于3列的：68，188，308
//对于2列的：90，260
//纵向位置比较有规律，每多1行+20，每多一块额外+10
//第一块：190，210，230
//第二块：260，280，300，320
//第三块：350，370，390，410
//第四块：440，460，480，500，520，540

int 属性标签X[CID_属性标签_束缚抗性-CID_属性标签_物理攻击+1]={
	68,188,308,
	68,188,
	68,

	68,212,
	68,188,
	68,188,308,
	68,188,308,

	90,260,
	90,260,
	90,260,
	90,260,

	68,
	68,188,308,
	68,188,308,
	68,188,308,
	68,188,308,
	68,
};

int 属性标签Y[CID_属性标签_束缚抗性-CID_属性标签+1]={
	190,190,190,
	210,210,
	230,

	260,260,
	280,280,
	300,300,300,
	320,320,320,

	350,350,
	370,370,
	390,390,
	410,410,

	440,
	460,460,460,
	480,480,480,
	500,500,500,
	520,520,520,
	540,
};

CImage* Ctrl角色详情面板;
BOOL DisplayRate=TRUE;

void 切换打造部位(int 新部位);	//UI打造区.cpp
int 获取装备图标ResId(int 部位,int 装备区索引,BOOL 灰色图标);	//UI装备区.cpp
void 同步装备设置(int SettingIndex);
int 打造部位变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);
void 同步提升率及格式();

//大小380*760
void 详细构建_角色详情面板(int PageId,CImage* Ctrl角色详情面板)
{
	::Ctrl角色详情面板=Ctrl角色详情面板;
	//DisplayRate=TRUE;

	//不同页面使用不同的背景
	int BackResId=RID_角色详情背景;
	if (PageId!=PageId_Setting)
		BackResId=RID_角色详情背景_短;
	Ctrl角色详情面板->SetImage(EasyLoadImageR(BackResId));

	//角色详情面板-》Q版角色
	SetCreateControlParam(角色详情面板宽度/2-42/2,124,Ctrl角色详情面板,PageId);
	CImage* CtrlQ版角色=EasyCreateImage(CID_角色详情_Q版角色,40,42);

	//角色详情面板-》职业名
	SetCreateControlParam(角色详情面板宽度/2-200/2,20,Ctrl角色详情面板,PageId);
	CLineLabel* Ctrl职业名=EasyCreateLineLabel(CID_角色面板职业标签,200,CLineLabel::MinHeightWithBorder,NULL);
	Ctrl职业名->SetAlign('-');
	Ctrl职业名->SetTextBorderColor(0xFF000000);
	Ctrl职业名->SetTextColor(0xFFFFFF00);

	//角色详情面板-》职业伤害类型
	SetCreateControlParam(角色详情面板宽度/2-200/2,40,Ctrl角色详情面板,PageId);
	CLineLabel* Ctrl职业伤害类型=EasyCreateLineLabel(CID_角色面板伤害类型标签,200,CLineLabel::MinHeightWithBorder,NULL);
	Ctrl职业伤害类型->SetAlign('-');
	Ctrl职业伤害类型->SetTextBorderColor(0xFF000000);
	Ctrl职业伤害类型->SetTextColor(0xFFFFFF00);

	//角色详情面板-》装备图标/贴膜图标/强化数字/徽章
	for (int i=0;i<拓展装备部位总数;i++)
	{
		//装备本体
		SetCreateControlParam(部位展示X[i],部位展示Y[i],Ctrl角色详情面板,PageId);
		CImage* Ctrl角色详情装备=EasyCreateImage(CID_角色面板上衣+i,28,28);
		if (PageId==PageId_Setting)
		{
			Ctrl角色详情装备->SetEventHandler(打造部位变更回调);
			Ctrl角色详情装备->SetUserData((PVOID)i);
		}

		if (i<=武器)
		{
			//装备强化/增幅/锻造数字（无回调）
			SetCreateControlParam(部位展示X[i]+28-19,部位展示Y[i]-10,Ctrl角色详情面板,PageId);
			CImage* Ctrl角色详情强化=EasyCreateImage(CID_角色面板上衣强化+i,19,10);
			if (i==武器)
			{
				SetCreateControlParam(部位展示X[i]-14,部位展示Y[i]-10,Ctrl角色详情面板,PageId);
				CImage* Ctrl角色详情锻造=EasyCreateImage(CID_角色面板武器锻造,19,10);
			}

			//装备贴膜
			SetCreateControlParam(部位展示X[i]-8,部位展示Y[i]+28-16,Ctrl角色详情面板,PageId);
			CImage* Ctrl角色详情贴膜=EasyCreateImage(CID_角色面板上衣贴膜+i,16,16);
			if (PageId==PageId_Setting)
			{
				Ctrl角色详情贴膜->SetEventHandler(打造部位变更回调);
				Ctrl角色详情贴膜->SetUserData((PVOID)i);
			}
		}

		if (i<耳环)
		{
			//徽章
			SetCreateControlParam(部位展示X[i]+28-13,部位展示Y[i]+28-8,Ctrl角色详情面板,PageId);
			CImage* Ctrl角色详情徽章=EasyCreateImage(CID_角色面板徽章+i,13,8);		
			if (PageId==PageId_Setting)
			{
				Ctrl角色详情徽章->SetEventHandler(打造部位变更回调);
				Ctrl角色详情徽章->SetUserData((PVOID)i);
			}
		}
	}

	//角色详情面板-》属性标签
	for (int i=CID_属性标签_物理攻击;i<=CID_属性标签_束缚抗性;i++)
	{
		int Index=i-CID_属性标签;
		int LabelWidth=56;
		if (i==CID_属性标签_属性强化 || i==CID_属性标签_属性抗性)
			LabelWidth=296;
		SetCreateControlParam(属性标签X[Index],属性标签Y[Index],Ctrl角色详情面板,PageId);
		CLineLabel* Ctrl属性标签=EasyCreateLineLabel(i,LabelWidth,14,L"123456");
		Ctrl属性标签->SetTextColor(0xFF4BA157);
		//Ctrl属性标签->SetBackColor(0x80FFFFFF);
		Ctrl属性标签->SetAlign('>');
	}

	//角色详情面板-》伤害标签
	SetCreateControlParam(120,590,Ctrl角色详情面板,PageId);
	CLineLabel* Ctrl伤害标签=EasyCreateLineLabel(CID_伤害标签,140,CLineLabel::MinHeightWithBorder,L"3 0000 0000 0000");
	Ctrl伤害标签->SetTextColor(0xFF4BA157);
	Ctrl伤害标签->SetTextBorderColor(0x8000FF00);
	Ctrl伤害标签->SetAlign('-');

	//角色详情面板-》提升率标签
	SetCreateControlParam(120,634,Ctrl角色详情面板,PageId);
	CLineLabel* Ctrl提升率标签=EasyCreateLineLabel(CID_提升率标签,140,CLineLabel::MinHeightWithBorder,L"-6.17%");
	Ctrl提升率标签->SetTextColor(0xFFBD3133);
	Ctrl提升率标签->SetTextBorderColor(0x20FF0000);
	Ctrl提升率标签->SetAlign('-');

	//伤害详情页面没有按钮，只展示信息
	if (PageId==PageId_Setting)
	{
		//角色详情面板-》设为基准按钮
		SetCreateControlParam(284,582,Ctrl角色详情面板,PageId);
		CButton* Ctrl设为基准按钮=EasyCreateFlatButton(CID_设为基准按钮,70,30,L"设为基准");
		Ctrl设为基准按钮->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
		{
			伤害计算结果.SetBase();
			同步提升率及格式();
			return 0;
		});

		//角色详情面板-》切换提升率/数值按钮
		SetCreateControlParam(284,626,Ctrl角色详情面板,PageId);
		CButton* Ctrl切换按钮=EasyCreateFlatButton(CID_提升率切换按钮,70,30,L"切换");
		Ctrl切换按钮->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
		{
			DisplayRate=!DisplayRate;
			同步提升率及格式();
			return 0;
		});

		//角色详情面板-》伤害详情按钮
		SetCreateControlParam(角色详情面板宽度/2-150/2,680,Ctrl角色详情面板,PageId);
		CButton* Ctrl伤害分析按钮=EasyCreateButton(CID_伤害详情按钮,150,50,L"伤害详情");
		Ctrl伤害分析按钮->SetEventHandler([](UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)->int
		{
			//为了方便，在条件设置场景时，以及计算模块更新数据后，直接同步到伤害详情页面，切换页面时不再执行初始化
			UiMgr->SetDisplayPage(PageId_DamageDetail);
			return 0;
		});
	}
}

void 重置设置_角色详情面板()
{
	UI_AdjustState++;
	for (int i=0;i<拓展装备部位总数;i++)
	{
		同步装备设置(设置_上衣+i);
		if (i<=武器)
		{
			同步装备设置(设置_上衣强化等级+i);
			if (i==武器)
				同步装备设置(设置_武器锻造等级);
			同步装备设置(设置_上衣贴膜+i);
		}
		if (i<耳环)
			同步装备设置(设置_上衣徽章1+i);	//内部会统计2个徽章，通知一次即可
	}
	//角色详情面板的其他内容由计算模块第一次计算后更新
	UI_AdjustState--;
}

int 打造部位变更回调(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent==EvtClick)
	{
		CVScrollView* Ctrl设置区=EasyFindControl<CVScrollView>(PageId_Setting,CID_设置区);
		if (Ctrl设置区->ViewPosY<打造面板标题Y-500 || Ctrl设置区->ViewPosY>打造面板标题Y+300)
			Ctrl设置区->SetViewPosY(打造面板标题Y);
		int 目标部位=(int)CtrlObj->GetUserData();
		切换打造部位(目标部位);
	}
	return 0;
}

void 同步装备设置(int SettingIndex)
{
	//设置ID和控件ID里，装备和贴膜的定义都连在一起，两者代码相同，合并在一起
	if (SettingIndex>=设置_上衣 && SettingIndex<=设置_武器贴膜)
	{
		//大多数装备使用彩色图标，但是对于未满足条件的装备（如沙漠肩需要灼烧对象），使用灰色图标显示
		//图标颜色和计算结果有关，角色详情面板的初始化时机早于计算，此时不设置图标
		//第一次产生计算结果后，会调用UpdateCalcResult()，才会设置图标
		if (伤害计算结果.Valid)
		{
			int 部位=SettingIndex-设置_上衣;
			int 装备区索引=GetIndexSetting(设置_上衣+部位);
			CImage* Ctrl装备1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板上衣+部位);
			CImage* Ctrl装备2=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色面板上衣+部位);
			int ResId=获取装备图标ResId(部位,装备区索引,!伤害计算结果.装备结果[部位].满足条件);
			Ctrl装备1->SetImage(EasyLoadImageR(ResId,GetIconType(ResId)));
			Ctrl装备2->SetImage(EasyLoadImageR(ResId,GetIconType(ResId)));
		}	
	}
	else if (SettingIndex>=设置_上衣强化类型 && SettingIndex<=设置_武器强化类型)
	{
		int 部位=SettingIndex-设置_上衣强化类型;
		int 类型=GetIndexSetting(设置_上衣强化类型+部位);
		int 等级=GetIndexSetting(设置_上衣强化等级+部位);
		CImage* Ctrl强化数字1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板上衣强化+部位);
		CImage* Ctrl强化数字2=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色面板上衣强化+部位);
		if (类型==0)
		{
			Ctrl强化数字1->SetImage(EasyLoadImageR(RID_强化数字+等级));
			Ctrl强化数字2->SetImage(EasyLoadImageR(RID_强化数字+等级));
		}
		else if (类型==1)
		{
			Ctrl强化数字1->SetImage(EasyLoadImageR(RID_增幅数字+等级));
			Ctrl强化数字2->SetImage(EasyLoadImageR(RID_增幅数字+等级));
		}	
	}
	else if (SettingIndex>=设置_上衣强化等级 && SettingIndex<=设置_武器强化等级)
	{
		int 部位=SettingIndex-设置_上衣强化等级;
		int 类型=GetIndexSetting(设置_上衣强化类型+部位);
		int 等级=GetIndexSetting(设置_上衣强化等级+部位);
		CImage* Ctrl强化数字1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板上衣强化+部位);
		CImage* Ctrl强化数字2=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色面板上衣强化+部位);
		if (类型==0)
		{
			Ctrl强化数字1->SetImage(EasyLoadImageR(RID_强化数字+等级));
			Ctrl强化数字2->SetImage(EasyLoadImageR(RID_强化数字+等级));
		}
		else if (类型==1)
		{
			Ctrl强化数字1->SetImage(EasyLoadImageR(RID_增幅数字+等级));
			Ctrl强化数字2->SetImage(EasyLoadImageR(RID_增幅数字+等级));
		}
	}
	else if (SettingIndex==设置_武器锻造等级)
	{
		int 部位=武器;
		int 等级=GetIndexSetting(设置_武器锻造等级);
		CImage* Ctrl强化数字1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板武器锻造);
		CImage* Ctrl强化数字2=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色面板武器锻造);
		Ctrl强化数字1->SetImage(EasyLoadImageR(RID_锻造数字+等级));
		Ctrl强化数字2->SetImage(EasyLoadImageR(RID_锻造数字+等级));
	}
	else if (SettingIndex>=设置_上衣徽章1 && SettingIndex<=设置_戒指徽章1)
	{
		int 部位=SettingIndex-设置_上衣徽章1;
		int 数量=0;
		//Index为0时是无徽章
		if (GetIndexSetting(设置_上衣徽章1+部位)!=0)
			数量++;
		if (GetIndexSetting(设置_上衣徽章2+部位)!=0)
			数量++;
		CImage* Ctrl徽章_1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板徽章+部位);
		CImage* Ctrl徽章_2=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色面板徽章+部位);
		Ctrl徽章_1->SetImage(EasyLoadImageR(徽章颜色ResId[部位]+数量));
		Ctrl徽章_2->SetImage(EasyLoadImageR(徽章颜色ResId[部位]+数量));
	}
	else if (SettingIndex>=设置_上衣徽章2 && SettingIndex<=设置_戒指徽章2)
	{
		int 部位=SettingIndex-设置_上衣徽章2;
		int 数量=0;
		//Index为0时是无徽章
		if (GetIndexSetting(设置_上衣徽章1+部位)!=0)
			数量++;
		if (GetIndexSetting(设置_上衣徽章2+部位)!=0)
			数量++;
		CImage* Ctrl徽章_1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板徽章+部位);
		CImage* Ctrl徽章_2=EasyFindControl<CImage>(PageId_DamageDetail,CID_角色面板徽章+部位);
		Ctrl徽章_1->SetImage(EasyLoadImageR(徽章颜色ResId[部位]+数量));
		Ctrl徽章_2->SetImage(EasyLoadImageR(徽章颜色ResId[部位]+数量));
	}
	else if (SettingIndex==设置_左槽徽章1 || SettingIndex==设置_右槽徽章1)
	{
		int 部位=SettingIndex-设置_上衣徽章1;
		int 数量=0;
		//Index为0时是无徽章
		if (GetIndexSetting(设置_上衣徽章1+部位)!=0)
			数量++;
		CImage* Ctrl徽章_1=EasyFindControl<CImage>(PageId_Setting,CID_角色面板徽章+部位);
		CImage* Ctrl徽章_2=EasyFindControl<CImage>(PageId_Setting,CID_角色面板徽章+部位);
		Ctrl徽章_1->SetImage(EasyLoadImageR(徽章颜色ResId[部位]+数量));
		Ctrl徽章_2->SetImage(EasyLoadImageR(徽章颜色ResId[部位]+数量));
	}
}

void 同步提升率及格式()
{
	//提升率显示格式切换仅限总伤害，因为文档规定必须要显示伤害、差值、提升率
	//伤害详情页面的技能伤害位置不够放第三项，也无法与设置页面的两项开关同步，因此无法提供
	WCHAR Buf[100];
	double 伤害差值=伤害计算结果.总伤害-伤害计算结果.总伤害对照;
	double 伤害对照=伤害计算结果.总伤害对照;
	if (fequal(伤害对照,0.0f))	//旧伤害为0时，显示100%提升（但正常计算情况下，结果不可能为0）
		伤害对照=伤害计算结果.总伤害;
	float 伤害提升率=伤害差值/伤害对照;
	CLineLabel* Ctrl提升率标签1=EasyFindControl<CLineLabel>(PageId_Setting,CID_提升率标签);
	CLineLabel* Ctrl提升率标签2=EasyFindControl<CLineLabel>(PageId_DamageDetail,CID_提升率标签);
	//注意，如果[伤害差值]和[总伤害对照]差距过于悬殊，提升率会显示0.0000%
	if (fabs(伤害差值)<10)
	{
		if (!DisplayRate)
			swprintf(Buf,L"无变化");
		else
			swprintf(Buf,L"无变化%%");
		Ctrl提升率标签1->SetTextColor(0xFFFFFFFF);
		Ctrl提升率标签1->SetTextBorderColor(0x80000000);
		Ctrl提升率标签2->SetTextColor(0xFFFFFFFF);
		Ctrl提升率标签2->SetTextBorderColor(0x20000000);
	}
	else if (伤害差值>=10)
	{
		if (!DisplayRate)
			FormatInt64WithChineseStyle(Buf,伤害差值,TRUE);
		else
			swprintf(Buf,L"%+.4f%%",伤害提升率*100.0f);
		Ctrl提升率标签1->SetTextColor(0xFF4BA157);
		Ctrl提升率标签1->SetTextBorderColor(0x8000FF00);
		Ctrl提升率标签2->SetTextColor(0xFF4BA157);
		Ctrl提升率标签2->SetTextBorderColor(0x8000FF00);
	}
	else
	{
		if (!DisplayRate)
			FormatInt64WithChineseStyle(Buf,伤害差值,TRUE);
		else
			swprintf(Buf,L"%+.4f%%",伤害提升率*100.0f);
		Ctrl提升率标签1->SetTextColor(0xFFBD3133);
		Ctrl提升率标签1->SetTextBorderColor(0x20FF0000);
		Ctrl提升率标签2->SetTextColor(0xFFBD3133);
		Ctrl提升率标签2->SetTextBorderColor(0x20FF0000);
	}
	Ctrl提升率标签1->SetText(Buf);
	Ctrl提升率标签2->SetText(Buf);
}

void 退出清理_角色详情面板()
{

}